package com.resou.reader.api.service;

import com.resou.reader.api.entry.ConsumptionDataBean;
import com.resou.reader.api.entry.LoginData;
import com.resou.reader.api.entry.LoginResult;
import com.resou.reader.api.entry.PayResultBean;
import com.resou.reader.api.entry.Probability;
import com.resou.reader.api.entry.Result;
import com.resou.reader.api.entry.ResultList;
import com.resou.reader.api.entry.UserInfoBean;
import com.resou.reader.api.entry.VersionBean;

import java.io.File;
import java.io.FileInputStream;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.Header;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Query;

public interface UserService {

    /**
     * 短信登录
     */
    @POST("api/clinetLogin")
    @FormUrlEncoded
    Observable<LoginResult<LoginData>> smsLogin(@Field("clinetVersion") String clientVersion,
                                                @Field("mobile") String mobile
            , @Field("code") String code, @Field("openId") String openId
            , @Field("loginType") String loginType, @Field("clientType") String clientType);

    /**
     * 游客登录
     */
    @POST("api/appleVisitorLogin")
    @FormUrlEncoded
    Observable<LoginResult<LoginData>> touristLogin(@Field("clinetVersion") String clientVersion,
                                                    @Field("visitorName") String mobile
            , @Field("userType") int code, @Field("clientType") String clientType);

    /**
     * 游客账号合并
     */
    @POST("merge/mergeAccount")
    @FormUrlEncoded
    Observable<Result<String>> mergeAccount(@Field("token") String token,
                                            @Field("phone") String phone,
                                            @Field("wexin") String wexin, @Field("qq") String qq);

    /**
     * 第三方登录
     * 2.第三方微信登录 3.第三方qq登录
     */
    @POST("api/clinetLogin")
    @FormUrlEncoded
    Observable<LoginResult<LoginData>> thirdLogin(@Field("clinetVersion") String clientVersion, @Field("loginType")
            String loginType, @Field("openId") String openId, @Field("sex") String sex, @Field("nickname") String nickname, @Field("headimgurl") String headimgurl, @Field("clientType") String clientType);

    /**
     *
     */
    @POST("user/bindMobile")
    @FormUrlEncoded
    Observable<Result> bindMobile(@Field("mobile") String mobile, @Field("code") String code, @Field("token") String token);

    //https://rs.resouxs.com/api/getUserInfo
    @POST("api/getUserInfo")
    @FormUrlEncoded
    Observable<Result<UserInfoBean>> getUserInfo(@Field("token") String token);

    /**
     * 注册
     * 客户端版本clinetVersion String
     * 手机号mobile String
     * 0-手机号注册 非0-第三方
     * 注册类型registerType String
     * 第三方登录标识openId String
     * 密码password String
     * 性别sex String
     * 第三方账号昵称nickname String
     * 头像 headimgurl String
     */
    @FormUrlEncoded
    @POST("api/register")
    Observable<Result> register(@Field("clinetVersion") String clinetVersion, @Field("mobile") String mobile, @Field("registerType") String registerType
            , @Field("openId") String openId, @Field("password") String password, @Field("sex") String sex, @Field("nickname") String nickname
            , @Field("headimgurl") String headimgurl, @Field("code") String code);

    /**
     * 发送短信验证码
     * 短信类型: 登录-login 注册-regist 忘记密码-fwpassword 绑定手机-bindmobile
     */
    @FormUrlEncoded
    @POST("api/smsSend")
    Observable<Result> smsSend(@Field("mobile") String mobile, @Field("smsType") String smsType);

    @FormUrlEncoded
    @POST("api/updateUserNickName")
    Observable<Result> updateUserHeadPic(@Header("token") String token, @Field("nickname") File nickname);

    /**
     * 修改昵称
     */
    @FormUrlEncoded
    @POST("api/updateUserNickName")
    Observable<Result> updateNickname(@Header("token") String token, @Field("nickname") String nickname);

    /**
     * 修改头像
     */
    @Multipart
    @POST("api/updateUserHeadImg")
    Observable<Result> updateUserIcon(@Header("token") String token, @Part MultipartBody.Part body);

    /**
     * 修改生日
     */
    @FormUrlEncoded
    @POST("api/updateUserBirth")
    Observable<Result> updateBirthday(@Header("token") String token, @Field("birthday") String birthday);

    /**
     * 检测用户是否设置生日
     */
    @POST("setbirthday/checking")
    Observable<Result> checkBirthdayState(@Header("token") String token);

    /**
     * 修改个性签名
     */
    @FormUrlEncoded
    @POST("api/updateBasicInfo")
    Observable<Result<UserInfoBean>> updateSign(@Field("token") String token, @Field("sign") String sign);


    /**
     * 修改性别
     */
    @FormUrlEncoded
    @POST("api/updateUserGender")
    Observable<Result<UserInfoBean>> updateUserGender(@Header("token") String token, @Field("gender") String sign);

    /**
     * 获取消费记录
     *
     * @param token    登录返回的token
     * @param page     页码
     * @param pageSize 每页数量
     * @return 消费记录
     */
    @FormUrlEncoded
    @POST("user/consumption/records")
    Observable<Result<ConsumptionDataBean>> consumptionRecords(@Header("token") String token, @Field("page") int page, @Field("pageSize") int pageSize);

    /**
     * 上传头像
     *
     * @return
     */
    @POST("/api/uploadHeadImg")
    Observable<Result> uploadHeadPortrait(@Header("token") String token, @Query("multipartFile") File file);


    /**
     * 检测版本更新
     *
     * @return
     */
    @POST("androidversioncheck/checking")
    Observable<Result<VersionBean>> checkVersionUpdata();


    /**
     * 获取广告显示概率
     *
     * @return
     */
    @POST("queryAdConfig")
    Observable<ResultList<Probability>> quearProbability();

}
